package com.wzw.springboot.principle.spel;

import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.ParserContext;
import org.springframework.expression.common.TemplateParserContext;
import org.springframework.expression.spel.SpelParserConfiguration;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

/**
 * @link https://docs.spring.io/spring-framework/docs/5.1.5.RELEASE/spring-framework-reference/core.html#expressions
 *
 * @author Wangzhiwen
 */
public class SpelApi {

    public static void main(String[] args) {
        m1();
        m2();
        m3();
    }

    /**
     * 1.基本表达式
     *      字面量表达式
     *      关系
     *      逻辑与算术运算表达式
     *      字符串连接及截取表达式
     *      三目运算表达式
     *      正则表达式
     *      括号优先级表达式
     */
    public static void m1() {
        // 1.使用ExpressionParser默认的实现SpelExpressionParser 表法是解析器
        ExpressionParser parser = new SpelExpressionParser(new SpelParserConfiguration(true, true));
        // 2.解析表达式得到Expression对象 表达式内使用双引号包单引号内容
        Expression expression = parser.parseExpression("'Hello Spring Expression Language'");
        // 3.直接获取表达式值 或 构建EvaluationContext对象填充占位符
        String expressionValue = expression.getValue(String.class);
        System.out.println(expressionValue);
    }

    public static void m2() {
        ExpressionParser parser = new SpelExpressionParser(new SpelParserConfiguration(true, true));
        Expression expression = parser.parseExpression("('Hello Spring Expression Language').concat(#end)");
        // 标准实现
        EvaluationContext context = new StandardEvaluationContext();
        context.setVariable("end", " Append");
        String expressionValue = expression.getValue(context, String.class);
        System.out.println(expressionValue);
    }

    public static void m3() {
        ExpressionParser parser = new SpelExpressionParser(new SpelParserConfiguration(true, true));
        // 只解析模板内容，默认是#{}
        ParserContext parserContext = new TemplateParserContext();
        Expression parseExpression = parser.parseExpression("#{'Parse Template Expression'.concat(#end)}", parserContext);
        // 上下文对象
        StandardEvaluationContext standardEvaluationContext = new StandardEvaluationContext();
        // 设置Bean工厂
        // standardEvaluationContext.setBeanResolver(new BeanFactoryResolver());
        standardEvaluationContext.setVariable("end", " Append");
        String expressionValue = parseExpression.getValue(standardEvaluationContext, String.class);
        parseExpression.setValue(standardEvaluationContext, "");
        System.out.println(expressionValue);
    }
}
